/*
 * ContextMenu - jQuery plugin for right-click context menus
 *
 * Author: Chris Domigan
 * Contributors: Dan G. Switzer, II
 * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Version: r2
 * Date: 16 July 2007
 *
 * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
 *
 */

(function($) {

    var menu, shadow, trigger, content, hash, currentTarget;
 var defaults = {
   menuStyle: {
   },
   itemStyle: {
   },
   itemHoverStyle: {
   },
   eventPosX: 'pageX',
   eventPosY: 'pageY',
   shadow : true,
   onContextMenu: null,
   onShowMenu: null,
   offsetTop:0,
    };

 $.fn.contextMenu = function(id, options) {
   if (!menu) {                                      // Create singleton menu
     menu = $('<div id="jqContextMenu"></div>')
              .hide()
              .css({position:'absolute', zIndex:'500'})
              .appendTo('body')
              .bind('click', function(e) { 
                e.stopPropagation();
              });
   }
   if (!shadow) {
     shadow = $('<div></div>')
                .css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
                .appendTo('body')
                .hide();
   }
   hash = hash || [];
   hash.push({
     id : id,
     menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
     itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
     itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
     bindings: options.bindings || {},
     shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
     onContextMenu: options.onContextMenu || defaults.onContextMenu,
     onShowMenu: options.onShowMenu || defaults.onShowMenu,
     eventPosX: options.eventPosX || defaults.eventPosX,
     eventPosY: options.eventPosY || defaults.eventPosY,
     offsetTop:options.offsetTop||defaults.offsetTop,//高度偏移量
   });

   var index = hash.length - 1;
   $(this).bind('contextmenu', function(e) {
     // Check if onContextMenu() defined
     var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
     if (bShowContext) display(index, this, e, options);
     return false;
   });
   return this;
 };

 function display(index, trigger, e, options) {
   var cur = hash[index];
   content = $('#'+cur.id).find('ul:first').clone(true);
   content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
     function() {
       $(this).css(cur.itemHoverStyle);
     },
     function(){
       $(this).css(cur.itemStyle);
     }
   ).find('img').css({verticalAlign:'middle',paddingRight:'2px'});

   // Send the content to the menu
   menu.html(content);

   // if there's an onShowMenu, run it now -- must run after content has been added
       // if you try to alter the content variable before the menu.html(), IE6 has issues
       // updating the content
   if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);

   $.each(cur.bindings, function(id, func) {
     $('#'+id, menu).bind('click', function(e) {
       hide();
       func(trigger, currentTarget); 
     });
   });

   //调整菜单显示位置
   var top = e[cur.eventPosY]-cur.offsetTop;
   var left = e[cur.eventPosX];
   menu.css({'left':left,'top':top}).show();
   var winh = $(window).height();
   var mh = menu.find("ul").height()+12;
   var winw = $(window).width();
   var mw = menu.find("ul").width()+2;
   if((mh+top)>winh){
    top = winh - mh
   }
   if((2*mw+left)>winw){
     left = left - mw -5;
   }
   menu.css({'left':left,'top':top})
  
   if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2-cur.offsetTop}).show();
   $(document).one('click', hide);
 }

 function hide() {
   menu.hide();
   shadow.hide();
 }

 // Apply defaults
 $.contextMenu = {
   defaults : function(userDefaults) {
     $.each(userDefaults, function(i, val) {
       if (typeof val == 'object' && defaults[i]) {
         $.extend(defaults[i], val);
       }
       else defaults[i] = val;
     });
   }
 };

})(jQuery);

$(function() {
 $('div.contextMenu').hide();
});